package com.sap.sap_mangers.mapper;


import com.sap.sap_mangers.Vo.SapVo.SessionNumber;
import com.sap.sap_mangers.Vo.SapVo.SexNumberInfo;
import com.sap.sap_mangers.Vo.UserVo.SapUserSessionList;
import com.sap.sap_mangers.Vo.UserVo.UserMessage;
import com.sap.sap_mangers.dto.user.RegisterUser;
import com.sap.sap_mangers.pojo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.sql.Timestamp;
import java.util.List;

/**
 * @author 阿东
 * @date 2022/6/30 [23:53]
 */
@Mapper
public interface UserMapper {

    /**
     * 通过学号查找用户信息
     * 注意！！这个方法返回的内容不包含name!! 对象里面name字段为null ！！！！可从缓存获取name - 血的教训
     *
     * @param username 学号
     * @return 用户信息
     */
    User getUserByUserName(@Param("username") String username);

    /**
     * 获取软件协会每一届的所有成员信息及其身份
     *
     * @param session 某一届
     * @return 成员信息及其身份
     */
    List<SapUserSessionList> getUserSessionList(@Param("session") Integer session);

    /**
     * 获取用户个人信息
     *
     * @param username 学号
     * @return 个人信息
     */
    UserMessage getUserMessage(@Param("username") String username);

    /**
     * 插入注册用户的信息
     *
     * @param registerUser 注册用户的信息
     */
    void registerUser(@Param("user") RegisterUser registerUser);

    /**
     * 通过学号来查询学号，如果是null则代表没有这个学号信息
     *
     * @param username 学号
     * @return 查询是否有信息
     */
    String getUsername(@Param("username") String username);

    /**
     * 查询是否有重复的qq
     *
     * @param qq qq
     * @return 是否存在重复的qq
     */
    String getQQ(@Param("qq") String qq);

    /**
     * 通过学号查找用户QQ
     *
     * @param username 学号
     * @return qq
     */
    String getQQByUsername(@Param("username") String username);

    /**
     * 通过以下信息来生成改用户的详细用户表
     *
     * @param username   学号
     * @param name       姓名
     * @param session    加入学年
     * @param createTime 创建时间
     */
    void registerUserDetails(@Param("username") String username, @Param("name") String name, @Param("session") Integer session, @Param("createTime") Timestamp createTime);

    /**
     * 获取加入软件协会的时间，这个时间是每年都会修改
     *
     * @return 加入软件协会的时间
     */
    String getJoinSapTime();

    /**
     * 修改用户的信息：网名，个性签名，性别，电话号码
     */
    void updateUserDefinition(@Param("detailsUser") DetailsUser detailsUser);

    /**
     * 通过id获取sap_user_details对应的全部信息
     *
     * @param id 用户名
     * @return 该用户的信息
     */
    DetailsUser getDetailsUserById(@Param("id") Integer id);

    /**
     * 修改密码
     *
     * @param user 用户
     */
    void updatePasswordByUsername(@Param("user") User user);

    /**
     * 获得user_post的信息
     *
     * @param username 学号
     * @return 用户信息
     */
    String getUserPostByUsername(@Param("username") String username);

    /**
     * 通过角色获取职位
     *
     * @param role 角色
     * @return 职位
     */
    String getPostByRole(@Param("role") Integer role);

    /**
     * 通过学号获取真实姓名
     *
     * @param username 学号
     * @return 真实姓名
     */
    String getRealNameByUserName(@Param("username") String username);

    /**
     * 获取用户个人头像
     *
     * @param username 学号
     * @return 头像的地址
     */
    String getUserHeadShot(@Param("username") String username);

    /**
     * 更改头像
     *
     * @param username 需要更改的学号
     * @param url      头像地址
     */
    void updateHeadShot(@Param("username") String username, @Param("url") String url);

    /**
     * 获取会长的学号
     *
     * @return 会长的学号
     */
    String getPresidentUserName();

    /**
     * 获取会长的qq
     *
     * @return 会长的qq
     */
    String getPresidentQQ();

    /**
     * 获取会长用户信息
     *
     * @return 会长用户信息
     */
    User getPresidentUser();

    /**
     * 获取所有部长及以上职务的用户的学号
     *
     * @return 所有部长及以上职务的用户的学号
     */
    List<String> getAllMinistersUsername();

    /**
     * 通过学号查询自己的消息通知
     *
     * @param username 学号
     * @return 消息通知集合
     */
    List<SapUserNotice> getNoticeByUsername(@Param("username") String username);

    /**
     * 查询所有消息通知内容
     *
     * @return 消息通知集合
     */
    List<SapUserNotice> getNoticeMessage();

    /**
     * 添加通知消息的内容
     *
     * @param sapUserNotice 消息
     */
    void addNotice(@Param("sapUserNotice") SapUserNotice sapUserNotice);

    /**
     * 确认消息
     *
     * @param username 确认消息的学号
     * @param notice   消息ID
     * @param time     确认消息的时间
     */
    void updateNotice(@Param("username") String username, @Param("notice") Integer notice, @Param("time") Timestamp time);

    /*
      ---------------------------------------------------------------------------
      以下内容是软协换届相关SQL
     */

    /**
     * 获取部长的相关信息
     *
     * @return 部长的用户信息
     */
    List<Minister> getMinister();

    /**
     * 获取普通成员信息
     *
     * @return 普通成员信息
     */
    List<Minister> getOrdinaryMembers();


    /**
     * 权限和职位变更
     *
     * @param role     权限
     * @param username 需要变更的学号
     */
    void updateRole(@Param("role") Integer role, @Param("username") String username);

    /**
     * 更新成员历史职位信息
     *
     * @param username 学号
     * @param context  历史职位信息
     */
    void updateHistory(@Param("username") String username, @Param("context") String context);

    /**
     * 插入成员历史职位信息(一般来说是注册账号以后插入，这时候的身份一般来说是游客)
     *
     * @param username 学号
     * @param name     姓名
     * @param time     创建时间
     * @param context  历史职位信息
     */
    void addHistory(@Param("username") String username, @Param("name") String name, @Param("time") Timestamp time, @Param("context") String context);


    /**
     * 设置权限(学号对应角色)
     * @param username 学号
     * @param role 角色
     */
    void addRole(@Param("username")String username,@Param("role") Integer role);

    /**
     * 修改权限(学号对应角色)
     * @param username 学号
     * @param role 角色
     */
    void updateUserRole(@Param("username")String username,@Param("role") Integer role);

    /**
     * 把新一届的管理层和正式成员加入到详细职位表
     *
     * @param username 学号
     * @param posts    职位
     * @param session  哪一届
     * @param rank     权限等级
     */
    void addPosts(@Param("username") String username, @Param("posts") String posts, @Param("session") Integer session, @Param("rank") Integer rank);

    /*
      以上内容是软协换届相关SQL
      ---------------------------------------------------------------------------
    */

    /**
     * 获取职位
     *
     * @param username 学号
     * @return 职位
     */
    String getHistoryPosts(@Param("username") String username);

    /**
     * 通过学号获取ip登录
     *
     * @param username 学号
     * @return ip记录
     */
    List<SapIp> getIpByUsername(@Param("username") String username);

    /**
     * 获取所有用户登录信息
     *
     * @return 登录信息
     */
    List<SapIp> getIp();

    /**
     * 添加ip记录(登录的时候添加)
     *
     * @param ip ip
     */
    void addIp(@Param("ip") SapIp ip);

    /**
     * 添加QQ
     *
     * @param qq       qq
     * @param username 学号
     */
    void updateQQ(@Param("qq") String qq, @Param("username") String username);

    /**
     * 获取基本的成员的信息
     *
     * @return 返回软协总人数，男生总人数，女生总人数
     */
    List<SexNumberInfo> getSexNumberInfo();

    /**
     * 获取每一届的人数
     *
     * @return 每届人数
     */
    List<SessionNumber> getSessionNumber();

    /**
     * 添加某个时间段在线人员信息
     *
     * @param sapOnlinePeople 在线人员信息
     */
    void addOnlinePeople(@Param("sapOnlinePeople") SapOnlinePeople sapOnlinePeople);

    /**
     * 获取在线人数详细信息
     *
     * @return
     */
    List<SapOnlinePeople> getOnlinePeopleMessage();

    /**
     * 提交问题或建议
     *
     * @param sapAdviceOrQuestion 内容信息
     */
    void addAdviceOrQuestion(@Param("sapAdviceOrQuestion") SapAdviceOrQuestion sapAdviceOrQuestion);

    /**
     * 获取都存在那几届软协成员
     * @return 年份
     */
    List<Integer> getSessionYear();

    /**
     * 给每个用户添加 留言板时间访问记录
     *
     * @param username 学号
     */
    void addMessageBoardRecord(@Param("username")Integer username);

    /**
     * 获取注册了软件协会账号但是没有加入软件协会的同学的信息
     * @param session 年份 自动补充%
     * @return ..
     */
    List<User> getNotJoinSapQq(@Param("session")String session);
}
